home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / getpwnamuid.c,v < prev    next >
Text File  |  1988-07-29  |  3KB  |  146 lines

  1. head     1.1;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.1
  9. date     88.07.29.17.48.29;  author ouster;  state Exp;
  10. branches ;
  11. next     ;
  12.  
  13.  
  14. desc
  15. @@
  16.  
  17.  
  18.  
  19. 1.1
  20. log
  21. @Initial revision
  22. @
  23. text
  24. @/*
  25.  * Copyright (c) 1983 Regents of the University of California.
  26.  * All rights reserved.  The Berkeley software License Agreement
  27.  * specifies the terms and conditions for redistribution.
  28.  */
  29.  
  30. #if defined(LIBC_SCCS) && !defined(lint)
  31. static char sccsid[] = "@@(#)getpwnamuid.c    5.3 (Berkeley) 12/21/87";
  32. #endif LIBC_SCCS and not lint
  33.  
  34. #include <stdio.h>
  35. #include <pwd.h>
  36. #include <ndbm.h>
  37.  
  38. #include <sys/file.h>
  39.  
  40. static char line[BUFSIZ+1];
  41. static struct passwd passwd;
  42.  
  43. /*
  44.  * The following are shared with getpwent.c
  45.  */
  46. extern    char *_pw_file;
  47. DBM    *_pw_db;
  48. int    _pw_stayopen;
  49.  
  50. static struct passwd *
  51. fetchpw(key)
  52.     datum key;
  53. {
  54.         register char *cp, *tp;
  55.  
  56.         if (key.dptr == 0)
  57.                 return ((struct passwd *)NULL);
  58.     key = dbm_fetch(_pw_db, key);
  59.     if (key.dptr == 0)
  60.                 return ((struct passwd *)NULL);
  61.         cp = key.dptr;
  62.     tp = line;
  63.  
  64. #define    EXPAND(e)    passwd.e = tp; while (*tp++ = *cp++);
  65.     EXPAND(pw_name);
  66.     EXPAND(pw_passwd);
  67.     bcopy(cp, (char *)&passwd.pw_uid, sizeof (int));
  68.     cp += sizeof (int);
  69.     bcopy(cp, (char *)&passwd.pw_gid, sizeof (int));
  70.     cp += sizeof (int);
  71.     bcopy(cp, (char *)&passwd.pw_quota, sizeof (int));
  72.     cp += sizeof (int);
  73.     EXPAND(pw_comment);
  74.     EXPAND(pw_gecos);
  75.     EXPAND(pw_dir);
  76.     EXPAND(pw_shell);
  77.         return (&passwd);
  78. }
  79.  
  80. struct passwd *
  81. getpwnam(nam)
  82.     char *nam;
  83. {
  84.         datum key;
  85.     register struct passwd *pw;
  86.  
  87.         if (_pw_db == (DBM *)0 &&
  88.         (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) {
  89.     oldcode:
  90.         setpwent();
  91.         while ((pw = getpwent()) && strcmp(nam, pw->pw_name))
  92.             ;
  93.         if (!_pw_stayopen)
  94.             endpwent();
  95.         return (pw);
  96.     }
  97.     if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) {
  98.         dbm_close(_pw_db);
  99.         _pw_db = (DBM *)0;
  100.         goto oldcode;
  101.     }
  102.         key.dptr = nam;
  103.         key.dsize = strlen(nam);
  104.     pw = fetchpw(key);
  105.     (void) flock(dbm_dirfno(_pw_db), LOCK_UN);
  106.     if (!_pw_stayopen) {
  107.         dbm_close(_pw_db);
  108.         _pw_db = (DBM *)0;
  109.     }
  110.         return (pw);
  111. }
  112.  
  113. struct passwd *
  114. getpwuid(uid)
  115.     int uid;
  116. {
  117.         datum key;
  118.     register struct passwd *pw;
  119.  
  120.         if (_pw_db == (DBM *)0 &&
  121.         (_pw_db = dbm_open(_pw_file, O_RDONLY)) == (DBM *)0) {
  122.     oldcode:
  123.         setpwent();
  124.         while ((pw = getpwent()) && pw->pw_uid != uid)
  125.             ;
  126.         if (!_pw_stayopen)
  127.             endpwent();
  128.         return (pw);
  129.     }
  130.     if (flock(dbm_dirfno(_pw_db), LOCK_SH) < 0) {
  131.         dbm_close(_pw_db);
  132.         _pw_db = (DBM *)0;
  133.         goto oldcode;
  134.     }
  135.         key.dptr = (char *) &uid;
  136.         key.dsize = sizeof uid;
  137.     pw = fetchpw(key);
  138.     (void) flock(dbm_dirfno(_pw_db), LOCK_UN);
  139.     if (!_pw_stayopen) {
  140.         dbm_close(_pw_db);
  141.         _pw_db = (DBM *)0;
  142.     }
  143.         return (pw);
  144. }
  145. @
  146.